package main

import (
	"LEARNGO/rpc/utils"
	"fmt"
	"log"
	"net/rpc"
)

func main() {
	//和RPC服务器建立连接
	client, err := rpc.DialHTTP("tcp", "47.108.61.154:8080") //如果已在一台远程服务器上开启，可以真的连入，而不是在localhost上的模拟
	if err != nil {
		log.Fatal("建立与服务端连接失败:", err)
	}
	//准备好传入的参数
	args := &utils.Args{10, 2}
	//准备好接收（返回）的参数
	var reply int

	//远程调用服务端上的方法。Call方法是同步调用
	err = client.Call("MathService.Multiply", args, &reply)
	if err != nil {
		log.Fatal("调用远程方法 MathService.Multiply 失败:", err)
	}
	fmt.Printf("%d * %d = %d \n", args.A, args.B, reply)

	//Go方法是异步调用
	//第4个参数是用于传入标记是否完成的通道。之所以传入nil，个人理解是可以通过 <-divideCall.Done 来判断是否调用完成
	divideCall := client.Go("MathService.Divide", args, &reply, nil)
	select {
	case <-divideCall.Done: //这里阻塞，等执行完成的信号。很像回调
		fmt.Printf("%d / %d = %d \n", args.A, args.B, reply)
	}
}
